블로그 릴레이 - CDK 와 Serverless express 사용해 보기

블로그 릴레이 - CDK 와 Serverless express 사용해 보기

안녕하세요 생산지원 그룹 리테일 어플리케이션부의 김승연입니다. 본 블로그는 당사의 한국어 블로그 릴레이의 열여덟 번째 블로그입니다. 이번 블로그 주제는 「CDK 와 Serverless express 사용해 보기」 입니다.
Clock Icon2024.10.27

안녕하세요 생산지원 그룹 리테일 어플리케이션부의 김승연입니다.

본 블로그는 당사의 한국어 블로그 릴레이의 열여덟 번째 블로그입니다.
이번 블로그 주제는 「CDK 와 Serverless express 사용해 보기」 입니다.

Serverless express란

Serverless express 는 AWS Lambda 를 이용한 서버리스 환경에서 Express를 사용한 REST API를 구축할 수 있게 도와주는 라이브러리라는 듯 합니다.

CDK를 깊게 다뤄보지 않아 보통의 CDK + AWS Lambda 구성에 비해 어떤 이점이 있는지는 아직 경험해 보지 않았지만, CDK + Serverless express 구성이라면 라우팅 구성 등에 이점이 있는 것 같습니다.

준비

Directory 구성

보통 mono repogitory로 많이 구성하는 듯하여 이번에는 아래의 구조로 프로젝트를 구성해 보았습니다.
참고로 mono repogitory 구성에는 workspaces를 이용하였습니다.

최종적으로는 아래의 구성으로 만들고 있습니다.

root
 - packages
  - iac ← CDK 구성
  - server ← Serverless express 구성
package.json
...

root/package.json

{
  "name": "root",
  "private": true,
  ...
  "scripts": {
   ...
  },
  ...
  "workspaces": [
    "packages/server",
    "packages/iac"
  ]
}

CDK 생성 + 관련 라이브러리 설치

root/iac

npx cdk init --language typescript

Serverless Express + 관련 라이브러리 설치

root/server

npm install express
npm install @codegenie/serverless-express
npm install cors
npm install --save-dev @types/cors

코드 작성

코드 작성은 사내의 아래의 블로그를 참고로 작성했습니다.
Serverless Express + AWS Lambda + API Gateway의 구성으로 AWS CDK 을 작성해 보았다

lib/iac-stack.ts

...
    // Lambda
    const restApiFunc = new cdk.aws_lambda_nodejs.NodejsFunction(
      this,
      'RestApiFunc',
      {
        architecture: cdk.aws_lambda.Architecture.ARM_64,
        runtime: cdk.aws_lambda.Runtime.NODEJS_20_X,
        entry: "../server/src/index.ts",
      }
    );

    // APIGateway REST API
    const restApi = new cdk.aws_apigateway.LambdaRestApi(this, 'RestApi', {
      handler: restApiFunc,
      defaultCorsPreflightOptions: {
        allowOrigins: cdk.aws_apigateway.Cors.ALL_ORIGINS,
        allowMethods: cdk.aws_apigateway.Cors.ALL_METHODS,
        allowHeaders: cdk.aws_apigateway.Cors.DEFAULT_HEADERS,
        maxAge: cdk.Duration.minutes(5),
      }, 
      deployOptions: {
        stageName: 'v1', 
        tracingEnabled: false, 
      },
    });

    // API Gateway EndPoint
    new cdk.CfnOutput(this, 'RestApiEndpoint', {
      value: restApi.deploymentStage.urlForPath(),
    });
...

server/src/index.ts

import serverlessExpress from '@codegenie/serverless-express';
import cors from 'cors';
import express, { Request, Response } from 'express';

const app = express();
app.use(cors());
app.use(express.json());

app.get('/', async (_req: Request, res: Response): Promise<void> => {
  res.status(200).send("Hello serverless express!");
});

export const handler = serverlessExpress({ app });

확인

준비가 끝났다면 CDK를 Deploy를 해줍니다.

npm run cdk bootstrap ← 최초만 실행 
npm run cdk deploy

마지막으로 아래를 통해 제대로 API가 실행되는지 확인해 주시면 됩니다.

curl -X GET -H "Content-Type: application/json" https://xxxxxxxx.execute-api.[region].amazonaws.com/v1/

이상, 한국어 블로그 릴레이의 열여덟 번째 「CDK 와 Serverless express 사용해 보기」 였습니다. 다음 열아홉 번째 블로그 릴레이는 11월 첫째 주에 공개됩니다.

끝까지 읽어주셔서 감사합니다!

참고자료

Serverless Express + AWS Lambda + API Gateway 의 구성으로 AWS CDK 을 작성해보았다
Serverless Express

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.